import type { OkPageResp, OkResp } from "./resp-guard";
import { ElMessage } from "element-plus";
import { $t } from "@/plugins/i18n";

/**
 * 通用 API 调用处理函数
 * @param requestFn 请求函数，返回一个包含响应数据的Promise
 * @param onSuccess 成功回调函数，接收响应数据和响应对象作为参数
 * @param onHandlers 可选的错误处理和最终处理回调函数
 * @param onHandlers.onCatch 错误处理回调函数，接收错误对象作为参数
 * @param onHandlers.onFinally 最终处理回调函数，无参数
 * @returns Promise\<void>
 */
export async function apiCall<T>(
    requestFn: () => Promise<Resp<T>>,
    onSuccess: (data: T, resp: OkResp<T> | OkPageResp<T>) => void,
    onHandlers?: {
        /** 接口成功调用, 但返回值失败时的回调函数 */
        onError?: (resp: Resp<T>) => void;
        /** 错误处理回调函数，接收错误对象作为参数 */
        onCatch?: (error: any) => void;
        /** 最终处理回调函数，无参数 */
        onFinally?: () => void;
    },
): Promise<void> {
    try {
        const resp = await requestFn();

        if (okPage(resp)) {
            onSuccess(resp.data, resp);
            return;
        }

        if (ok(resp)) {
            onSuccess(resp.data, resp);
            return;
        }

        onHandlers?.onError?.(resp);
        ElMessage.error($t(resp.message));
    } catch (e: any) {
        // 错误的提示信息已经在响应拦截器中处理过了, 无需重复提示
        onHandlers?.onCatch?.(e);
    } finally {
        onHandlers?.onFinally?.();
    }
}
